package top.yazif.excel;

import top.yazif.exception.ExcelException;
import top.yazif.exception.ExcelIndexOutOfBoundsException;

import java.io.IOException;

/**
 * Created by Yazif on 2017/3/18.
 */
public interface Excel {

    /**
     * 通过工作表的索引设置当前工作的工作表
     * @param index 工作表的索引
     * @throws ExcelIndexOutOfBoundsException
     * @throws ExcelException
     */
    void setSheet(int index) throws ExcelIndexOutOfBoundsException, ExcelException;

    /**
     * 通过工作表的名称设置当前工作的工作表
     * 当工作表的名称不存在时抛出<code>ExcelException</code>异常
     * @param name  工作表名称
     * @throws ExcelException
     */
    void setSheet(String name) throws ExcelException;

    /**
     * 获取当前工作的行数
     * @return
     */
    int getNumberOfRows();

    /**
     * 获取行所拥有的单元格数
     * @param rowIndex 行索引
     * @return 行所拥有的单元格数
     * @throws ExcelIndexOutOfBoundsException
     */
    int getNumberOfCell(int rowIndex) throws ExcelIndexOutOfBoundsException;


    /**
     * 判断当前工作表索引为<code>row</code>的行是否激活
     * 激活返回<code>true</code>
     * 否则返回<code>false</code>
     * @param row
     * @return
     */
    boolean isRowActive(int row);


    /**
     * 将工作簿另存到<code>file</code>中
     * @param file 保存的文件的地址
     * @throws IOException
     */
    void save(String file) throws IOException;


    /**
     * 通过工作表的行和列获取当前工作表的单元格的值
     * 当单元格未被创建时，单元格将被创建，并取得空值
     * @param row 行索引
     * @param col 列索引
     * @return 当前工作表行索引为<code>row</code>列索引为<code>col</code>的单元格的值
     */
    String getValue(int row,int col);

    void addSheet(String name) throws ExcelException;


    /**
     * 获取工作簿里名称为<code>name</code>单元格的值
     * <code>name</code>所指定的单元域必须是连续的
     * 当指定的名称<code>name</code为单元格域时，返回该域第一个单元格的值
     * 当指定的名称<code>name</code>不存在时，抛出<code>ExcelException</code>异常
     * @param name 单元格的名称
     * @return 对应单元格名称的值
     * @throws ExcelException
     */
    String getValue(String name) throws ExcelException;


    /**
     * 获取工作簿里名称为<code>name</code>单元域的值
     * <code>name</code>所指定的单元域必须是连续的
     * 当指定的名称<code>name</code>不存在时，抛出<code>ExcelException</code>异常
     * @param name 单元域的名称
     * @return 名称为<code>name</code>单元域的值
     * @throws ExcelException
     */
    String[] getValues(String name) throws ExcelException;


    /**
     * 通过工作表的行和列设置当前工作表的单元格的值
     * @param value 要设置的值
     * @param row 行索引
     * @param col 列索引
     */
    void setCellValue(String value, int row, int col);

    /**
     * 设置工作簿里名称为<code>name</code>单元域的值
     * <code>name</code>所指定的单元域必须是连续的
     * 当指定的名称<code>name</code>为单元格域时，则设置该域第一个单元格的值
     * 当指定的名称<code>name</code>不存在时，抛出<code>ExcelException</code>异常
     * @param value 要设置的值
     * @param name 单元格的名称
     * @throws ExcelException
     */
    void setCellValue(String value, String name) throws ExcelException;

    /**
     * 设置工作簿里名称为<code>name</code>单元域的值
     * <code>name</code>所指定的单元域必须是连续的
     * 填充方式为“从左至右，从上至下”
     * 当<code>values</code>的长度大于单元域的长度时，<code>values</code>将被截断
     * 当<code>values</code>的长度小于单元域的长度时，<code>values</code>将从头开始填充
     * 当指定的名称<code>name</code>不存在时，抛出<code>ExcelException</code>异常
     * @param values 要设置的值
     * @param name 单元域的名称
     * @throws ExcelException
     */
    void setCellValues(String[] values, String name) throws ExcelException;

    /**
     * 关闭并保存工作簿
     */
    void close()throws Exception;

    /**
     * 判断excel工作簿是否关闭
     * @return 关闭返回<code>true</code>， 否则返回<code>false</code>
     */
    boolean isClosed();

    /**
     * 打开工作簿
     */
    void open() throws ExcelException;


    /**
     * 未完成，后补充
     */
}
